package com.sky.controller.admin;

import com.sky.annotation.IgnoreToken;
import com.sky.dto.MaterialTemplateDTO;
import com.sky.dto.MaterialTemplatePageQueryDTO;
import com.sky.entity.MaterialTemplate;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.MaterialTemplateService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.validation.Valid;
import java.util.List;

/**
 * 材料模板管理控制器
 */
@RestController
@RequestMapping("/admin/material-template")
@Slf4j
@Api(tags = "材料模板管理接口")
@CrossOrigin
public class MaterialTemplateController {

    @Autowired
    private MaterialTemplateService materialTemplateService;

    /**
     * 测试接口
     */
    @GetMapping("/test")
    @ApiOperation("测试接口")
    public Result<String> test() {
        log.info("材料模板管理测试接口被调用");
        return Result.success("材料模板管理接口正常工作");
    }

    /**
     * 新增材料模板
     */
    @PostMapping("/add")
    @ApiOperation("新增材料模板")
    public Result<String> add(@Valid @RequestBody MaterialTemplateDTO materialTemplateDTO) {
        log.info("新增材料模板：{}", materialTemplateDTO);
        materialTemplateService.add(materialTemplateDTO);
        return Result.success();
    }

    /**
     * 修改材料模板
     */
    @PutMapping
    @ApiOperation("修改材料模板")
    public Result<String> update(@Valid @RequestBody MaterialTemplateDTO materialTemplateDTO) {
        log.info("修改材料模板：{}", materialTemplateDTO);
        materialTemplateService.update(materialTemplateDTO);
        return Result.success();
    }

    /**
     * 删除材料模板
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除材料模板")
    public Result<String> delete(@PathVariable Long id) {
        log.info("删除材料模板：{}", id);
        materialTemplateService.delete(id);
        return Result.success();
    }

    /**
     * 批量删除材料模板
     */
    @DeleteMapping("/batch")
    @ApiOperation("批量删除材料模板")
    public Result<String> batchDelete(@RequestBody List<Long> ids) {
        log.info("批量删除材料模板：{}", ids);
        materialTemplateService.batchDelete(ids);
        return Result.success();
    }

    /**
     * 分页查询材料模板
     */
    @GetMapping("/page")
    @ApiOperation("分页查询材料模板")
    public Result<PageResult> page(MaterialTemplatePageQueryDTO queryDTO) {
        log.info("分页查询材料模板：{}", queryDTO);
        PageResult pageResult = materialTemplateService.page(queryDTO);
        return Result.success(pageResult);
    }

    /**
     * 根据ID查询材料模板
     */
    @GetMapping("/{id}")
    @ApiOperation("根据ID查询材料模板")
    public Result<MaterialTemplate> getById(@PathVariable Long id) {
        log.info("根据ID查询材料模板：{}", id);
        MaterialTemplate materialTemplate = materialTemplateService.getById(id);
        return Result.success(materialTemplate);
    }

    /**
     * 获取所有启用的材料模板
     */
    @GetMapping("/enabled")
    @ApiOperation("获取所有启用的材料模板")
    public Result<List<MaterialTemplate>> getAllEnabled() {
        log.info("获取所有启用的材料模板");
        List<MaterialTemplate> list = materialTemplateService.getAllEnabled();
        return Result.success(list);
    }

    /**
     * 启用/禁用材料模板
     */
    @PutMapping("/status/{id}")
    @ApiOperation("启用/禁用材料模板")
    public Result<String> updateStatus(@PathVariable Long id, @RequestParam Integer status) {
        log.info("更新材料模板状态：id={}, status={}", id, status);
        materialTemplateService.updateStatus(id, status);
        return Result.success();
    }

    /**
     * 上传材料图标
     */
    @PostMapping("/upload-icon")
    @ApiOperation("上传材料图标")
    @IgnoreToken
    public Result<String> uploadIcon(@RequestParam("file") MultipartFile file) {
        log.info("上传材料图标：{}", file.getOriginalFilename());
        try {
            String iconUrl = materialTemplateService.uploadIcon(file);
            log.info("上传成功，返回URL：{}", iconUrl);
            return Result.success(iconUrl);
        } catch (Exception e) {
            log.error("上传失败", e);
            return Result.error("上传失败：" + e.getMessage());
        }
    }
    
    /**
     * 测试上传功能
     */
    @GetMapping("/upload-test")
    @ApiOperation("测试上传功能")
    public Result<String> testUpload() {
        log.info("测试上传功能");
        
        // 检查上传目录
        String uploadDir = System.getProperty("user.dir") + java.io.File.separator + "uploads" + java.io.File.separator + "material-icons" + java.io.File.separator;
        java.io.File dir = new java.io.File(uploadDir);
        
        String message = String.format("当前工作目录：%s，上传目录：%s，目录存在：%s", 
            System.getProperty("user.dir"), uploadDir, dir.exists());
        
        log.info(message);
        return Result.success(message);
    }

    /**
     * 小程序专用：获取材料模板列表
     */
    @GetMapping("/miniapp/list")
    @ApiOperation("小程序专用：获取材料模板列表")
    @IgnoreToken
    public Result<List<MaterialTemplate>> getMaterialTemplatesForMiniapp() {
        log.info("小程序获取材料模板列表");
        List<MaterialTemplate> list = materialTemplateService.getAllEnabled();
        return Result.success(list);
    }
}
